#if !defined(__SYNCHRO_SERVEUR_H)
#define __SYNCHRO_SERVEUR_H

#include "synchronisation.h"

template <>
synchronisation<serveur_reseau>::synchronisation(serveur_reseau &t) throw(erreur) {
	// Récupère le temps actuel local
	temps::type_temps now = temps::maintenant();
	
	// Reçoit le temps distant "actuel" (si le client joue le jeu)
	char *buffer[TAILLE_BUFFER];
	t.recepteur().recevoir_tcp(buffer);
	temps::type_temps now_distant = *(reinterpret_cast<temps::type_temps*>(buffer));
	
	// Calcule la différence, attention, il faudra lui soustraire le temps de latence
	// moyen de transmission du paquet pour que ce soit le delta qu'on recherche
	signed int delta = now - now_distant;
	
	// On va opérer à l'envoi d'un certain nombre de paquets et on va calculer
	// le temps moyen de roundtrip, c'est-à-dire le temps moyen d'aller-retour.
	
	int nb_envoyes = 0;
	
	// C'est cet objet qui va nous pondre la moyenne
	moyenneur_temps moyenne_roundtrip;
	// On envoie des instantanés pour être réaliste par rapport à la taille
	// du paquet UDP transmis
	instantane_du_piano instantane_retourne;
	// Le test se déroulera avec une consommation CPU "maximale", car on veut
	// connaître uniquement la latence du réseau, donc aucune attente de notre
	// côté, et bien sûr il faut bien s'en aller au bout d'un temps défini.
	minuterie<sans_attente> temps_depasse(timeout);
	
	while(!temps_depasse) {
		// Envoi du paquet suivant
		if(nb_envoyes < nb_a_envoyer) {
			instantane_du_piano i;
			t.emetteur().envoyer_udp(i);
			++nb_envoyes;
		}
		
		// Réception éventuelle d'un paquet (les paquets venant du client sont
		// marqués de la note do1)
		if(t.recepteur().recevoir_udp(instantane_retourne) && instantane_retourne[do1])
			// Accumulation de la nouvelle valeur
			moyenne_roundtrip(temps::maintenant() - instantane_retourne.timestamp());
	}
	
	// En guise d'informations, donnons un indicateur de la santé de la connexion
	sante_connexion_ = moyenne_roundtrip.nb_echantillons() * 1.0f / nb_a_envoyer;
	
	// Définit le delta, la moyenne du roundtrip, et c'est fini, Ginette
	doc_emmett_brown::instance().set_delta((long int)(delta - ((double)moyenne_roundtrip / 2)));
	moyenne_roundtrip_ = moyenne_roundtrip;
}

#endif
